package com.haidechizi.designpattern.singleton.lazy;

/**
 * @author haidechizi
 */
public class DoubleCheckLazySingleton {

    private DoubleCheckLazySingleton() {
    }

    /**
     * 通过volatile关键字防止初始化对象的指令被冲排序
     */
    private static volatile DoubleCheckLazySingleton doubleCheckLazySingleton = null;

    public static final DoubleCheckLazySingleton getInstance() {
        // 第一次检查，判断实例是否为空
        if (doubleCheckLazySingleton == null) {
            // 加锁，当有多个线程访问时，进行排队
            synchronized (DoubleCheckLazySingleton.class) {
                // 第二次检测，当多个线程在synchronized处排队时，第二次检测可以防止实例重新被初始化
                if (doubleCheckLazySingleton == null) {
                    doubleCheckLazySingleton = new DoubleCheckLazySingleton();
                }
            }
        }
        return doubleCheckLazySingleton;
    }
}
